// var obj = {
//   name: "frank",
//   friend: { name: "kobe" },
//   age: 18,
// };

// obj["name"] = "james";
// console.log(obj);

// ES6中的Symbol的使用
const s1 = Symbol();
const s2 = Symbol();
console.log(s1 == s2);

// ES2019(ES10)中，Symbol还有一个描述
const s3 = Symbol("aaa");
console.log(s3.description);

// 1. 在定义对象字面量时使用
const obj = {
  [s1]: "abc",
  [s2]: "cba",
};

// 2. 新增属性
obj[s3] = "nba";

// 3. Object.defineProperty方式
const s4 = Symbol();
Object.defineProperty(obj, s4, {
  enumerable: true,
  configurable: true,
  writable: true,
  value: "mba",
});

console.log(obj[s1], obj[s2], obj[s3], obj[s4]);
// 注意，不能通过 . 语法获取

// 使用Symbol作为key的属性名，在遍历中是获取不到的这些Symbol值
// 需要通过Object.getOwnPropertySymbols()来获取所有的Symbol的key
console.log(Object.keys(obj));
console.log(Object.getOwnPropertyNames(obj));
console.log(Object.getOwnPropertySymbols(obj));

const sKeys = Object.getOwnPropertySymbols(obj);
for (const skey of sKeys) {
  console.log(obj[skey]);
}

// Symbol.for(key)
const sa = Symbol.for("aa");
const sb = Symbol.for("aa");
console.log(sa === sb);

const key = Symbol.keyFor(sa);
console.log(key);
const sc = Symbol.for(key);
console.log(sa == sc);
